package cn.tedu.api;
//测试 多线程售票
//1, 需求: 设计4个售票窗口，总计售票100张。
public class Test2 {
    public static void main(String[] args) {
        MyTickets2 target = new MyTickets2();
        Thread t1 = new Thread(target);
        t1.start();
        Thread t2 = new Thread(target);
        t2.start();
        Thread t3 = new Thread(target);
        t3.start();
        Thread t4 = new Thread(target);
        t4.start();

    }
}
//方式2 ：implements Runnable
class MyTickets2 implements  Runnable{
     int tickets = 100;
     Object o =new Object();
     String s ="123";
    @Override
    //TODO 1,现在由于多线程 中,,对于共享资源进行了抢的操作,所以共享资源不安全
    //可以使用锁 来保证安全,但是牺牲性能.synchronized表示锁
    //锁可以用在方法上也可以用在代码块上.
    //同步方法  synchronized public void run() {
    //同步代码块 -- synchronized(锁对象){有问题代码}

     public void run() {
            while (true) {
                //    同步代码块：需要考虑两个问题：
//    1 锁的位置（位置合理，从开始用到用完结束）
//    2 锁对象（必须是同一个对象）
                try {
                    Thread.sleep(150);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//              synchronized(new Object){ //四个线程new了4把锁，不是同一锁对象
//                synchronized(o){//同一个锁对象 OK！！
//                synchronized(s){//同一个锁对象 OK！！
                synchronized(this){//同一个锁对象 OK！！
                if (tickets > 0) {
                    Thread now = Thread.currentThread();
                    System.out.println(now.getName() + "  " + tickets--);
                } else {
                    break;
                }
            }
        }
    }
}
